package com.zzyl.serve.service.impl;

import java.util.List;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.zzyl.common.core.domain.model.LoginUser;
import com.zzyl.common.utils.DateUtils;
import com.zzyl.common.utils.SecurityUtils;
import com.zzyl.serve.dto.AlertDataPageDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zzyl.serve.mapper.AlertDataMapper;
import com.zzyl.serve.domain.AlertData;
import com.zzyl.serve.service.IAlertDataService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import java.util.Arrays;

import static com.zzyl.common.utils.SecurityUtils.getUserId;

/**
 * 报警数据Service业务层处理
 *
 * @author iteheima
 * @date 2025-03-18
 */
@Service
public class AlertDataServiceImpl extends ServiceImpl<AlertDataMapper, AlertData> implements IAlertDataService {
    @Autowired
    private AlertDataMapper alertDataMapper;

    /**
     * 查询报警数据
     *
     * @param id 报警数据主键
     * @return 报警数据
     */
    @Override
    public AlertData selectAlertDataById(Long id) {
        return getById(id);
    }

    /**
     * 查询报警数据列表
     *
     * @param alertData 报警数据
     * @return 报警数据
     */
    @Override
    public List<AlertData> selectAlertDataList(AlertData alertData) {
        return alertDataMapper.selectAlertDataList(alertData);
    }

    /**
     * 新增报警数据
     *
     * @param alertData 报警数据
     * @return 结果
     */
    @Override
    public int insertAlertData(AlertData alertData) {
        return save(alertData) ? 1 : 0;
    }

    /**
     * 修改报警数据
     * [处理设备报警数据]
     *
     * @param alertData 报警数据
     * @return 结果
     */
    @Override
    public int updateAlertData(AlertData alertData) {
        //将传入的报警数据对象 alertData 的状态设置为 1，表示“已处理”。
        alertData.setStatus(1);
        //调用工具类 SecurityUtils.getLoginUser() 获取当前登录用户的信息。
        LoginUser loginUser = SecurityUtils.getLoginUser();
        //将当前登录用户的 ID 设置为报警数据的处理人 ID。
        alertData.setProcessorId(loginUser.getUserId());
        //将当前登录用户的昵称设置为报警数据的处理人名称。
        alertData.setProcessorName(loginUser.getUser().getNickName());

        AlertData alertData1 = getOne(new LambdaQueryWrapper<AlertData>()
                .eq(AlertData::getId, alertData.getId()));
        String iotId = alertData1.getIotId();

        LambdaUpdateWrapper<AlertData> updateWrapper  = new LambdaUpdateWrapper<>();
        updateWrapper.eq(AlertData::getIotId, iotId)
                .eq(AlertData::getStatus, 0)

                .set(AlertData::getStatus, 1)
                .set(AlertData::getProcessorId, loginUser.getUserId())
                .set(AlertData::getProcessorName, loginUser.getUser().getNickName())
                .set(AlertData::getProcessingTime, alertData.getProcessingTime())
                .set(AlertData::getProcessingResult, alertData.getProcessingResult());

        //调用 MyBatis Plus 提供的 updateById 方法更新数据库中的报警数据。
        return update(updateWrapper) ? 1 : 0;
    }

    /**
     * 批量删除报警数据
     *
     * @param ids 需要删除的报警数据主键
     * @return 结果
     */
    @Override
    public int deleteAlertDataByIds(Long[] ids) {
        return removeByIds(Arrays.asList(ids)) ? 1 : 0;
    }

    /**
     * 删除报警数据信息
     *
     * @param id 报警数据主键
     * @return 结果
     */
    @Override
    public int deleteAlertDataById(Long id) {
        return removeById(id) ? 1 : 0;
    }

    /*
     * 分页查询报警数据
     * */
    @Override
    public List<AlertData> pageList(AlertDataPageDto dto) {
        List<AlertData> list = this.list(new LambdaQueryWrapper<AlertData>()
                //如果传入的 deviceName 不为空，则添加对应的查询条件。按设备名称精确匹配
                .eq(dto.getDeviceName() != null && !dto.getDeviceName().isEmpty(),
                        AlertData::getDeviceName, dto.getDeviceName())
                //按状态筛选.如果传入的 status 不为 null，则添加对应的状态查询条件。
                .eq(dto.getStatus() != null, AlertData::getStatus, dto.getStatus())
                .eq(AlertData::getUserId, getUserId())
                //按创建时间范围筛选.如果传入的 startTime 和 endTime 都不为 null，则添加对应的时间查询条件。
                .between(dto.getStartTime() != null && dto.getEndTime() != null,
                        AlertData::getCreateTime, dto.getStartTime(), dto.getEndTime()));
        return list;
    }


}
